<?php

/**
 * CFormButtonElement class file.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.yiiframework.com/
 * @copyright 2008-2013 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

/**
 * CFormButtonElement represents a form button element.
 *
 * CFormButtonElement can represent the following types of button based on {@link type} property:
 * <ul>
 * <li>htmlButton: a normal button generated using {@link CHtml::htmlButton}</li>
 * <li>htmlReset a reset button generated using {@link CHtml::htmlButton}</li>
 * <li>htmlSubmit: a submit button generated using {@link CHtml::htmlButton}</li>
 * <li>submit: a submit button generated using {@link CHtml::submitButton}</li>
 * <li>button: a normal button generated using {@link CHtml::button}</li>
 * <li>image: an image button generated using {@link CHtml::imageButton}</li>
 * <li>reset: a reset button generated using {@link CHtml::resetButton}</li>
 * <li>link: a link button generated using {@link CHtml::linkButton}</li>
 * </ul>
 * The {@link type} property can also be a class name or a path alias to the class. In this case,
 * the button is generated using a widget of the specified class. Note, the widget must
 * have a property called "name".
 *
 * Because CFormElement is an ancestor class of CFormButtonElement, a value assigned to a non-existing property will be
 * stored in {@link attributes} which will be passed as HTML attribute values to the {@link CHtml} method
 * generating the button or initial values of the widget properties.
 *
 * @property string $on Scenario names separated by commas. Defaults to null.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @package system.web.form
 * @since 1.1
 */
class CFormButtonElement extends CFormElement
{

    /**
     * @var array Core button types (alias=>CHtml method name)
     */
    public static $coreTypes = array(
        'htmlButton' => 'htmlButton',
        'htmlSubmit' => 'htmlButton',
        'htmlReset' => 'htmlButton',
        'button' => 'button',
        'submit' => 'submitButton',
        'reset' => 'resetButton',
        'image' => 'imageButton',
        'link' => 'linkButton',
    );

    /**
     * @var string the type of this button. This can be a class name, a path alias of a class name,
     * or a button type alias (submit, button, image, reset, link, htmlButton, htmlSubmit, htmlReset).
     */
    public $type;

    /**
     * @var string name of this button
     */
    public $name;

    /**
     * @var string the label of this button. This property is ignored when a widget is used to generate the button.
     */
    public $label;
    private $_on;

    /**
     * Returns a value indicating under which scenarios this button is visible.
     * If the value is empty, it means the button is visible under all scenarios.
     * Otherwise, only when the model is in the scenario whose name can be found in
     * this value, will the button be visible. See {@link CModel::scenario} for more
     * information about model scenarios.
     * @return string scenario names separated by commas. Defaults to null.
     */
    public function getOn()
    {
        return $this->_on;
    }

    /**
     * @param string $value scenario names separated by commas.
     */
    public function setOn($value)
    {
        $this->_on = preg_split('/[\s,]+/', $value, -1, PREG_SPLIT_NO_EMPTY);
    }

    /**
     * Returns this button.
     * @return string the rendering result
     */
    public function render()
    {
        $attributes = $this->attributes;
        if (isset(self::$coreTypes[$this->type])) {
            $method = self::$coreTypes[$this->type];
            if ($method === 'linkButton') {
                if (!isset($attributes['params'][$this->name]))
                    $attributes['params'][$this->name] = 1;
            }
            elseif ($method === 'htmlButton') {
                $attributes['type'] = $this->type === 'htmlSubmit' ? 'submit' : ($this->type === 'htmlReset' ? 'reset' : 'button');
                $attributes['name'] = $this->name;
            } else
                $attributes['name'] = $this->name;
            if ($method === 'imageButton')
                return CHtml::imageButton(isset($attributes['src']) ? $attributes['src'] : '', $attributes);
            else
                return CHtml::$method($this->label, $attributes);
        }
        else {
            $attributes['name'] = $this->name;
            ob_start();
            $this->getParent()->getOwner()->widget($this->type, $attributes);
            return ob_get_clean();
        }
    }

    /**
     * Evaluates the visibility of this element.
     * This method will check the {@link on} property to see if
     * the model is in a scenario that should have this string displayed.
     * @return boolean whether this element is visible.
     */
    protected function evaluateVisible()
    {
        return empty($this->_on) || in_array($this->getParent()->getModel()->getScenario(), $this->_on);
    }

}
